package com.longcai.service.handler;

import com.alibaba.fastjson.JSON;
import com.longcai.bean.ApiResult;
import com.longcai.constants.SaoBeiConstants;
import com.longcai.entity.payment.saobei.response.ClyjSaobeiPaymentLogResp;
import com.longcai.entity.payment.saobei.response.ClyjSaobeiPaymentQueryResp;
import com.longcai.entity.payment.saobei.response.ClyjSaobeiPaymentRefundResp;
import com.longcai.entity.payment.weixin.request.ClyjSaoBeiWeiXinJsApiRequest;
import com.longcai.enums.ResultEnum;
import com.longcai.util.MD5;
import com.longcai.util.StringUtils;
import com.longcai.vo.payment.saobei.ClyjSaobeiPaymentLogVo;
import com.longcai.vo.payment.saobei.ClyjSaobeiPaymentQuery;
import com.longcai.vo.payment.saobei.ClyjSaobeiPaymentRefund;
import com.longcai.vo.payment.saobei.ClyjSaobeiTradeNotify;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/****
 *
 * @author 作者: hyf

 * @version 创建时间：2019年4月11日 下午3:39:53

 * 类说明
 */
@Service
public class SaoBeiPaymentLogicHandler {


    private static Logger logger = LoggerFactory.getLogger(SaoBeiPaymentLogicHandler.class);

    /**
     * 扫呗 统一下单预支付    请求参数校验
     **/
    public ApiResult<?> checkJspayRequestParam(ClyjSaobeiPaymentLogVo clyjSaobeiPaymentLogVo) {
        /**请求类型，010微信，020支付宝，060qq钱包，090口碑，100翼支付**/
        String pay_type = clyjSaobeiPaymentLogVo.getPayType();
        /**接口类型，当前类型012**/
        String service_id = clyjSaobeiPaymentLogVo.getServiceId();
        /**终端流水号 terminal_trace**/
        String terminal_trace = clyjSaobeiPaymentLogVo.getTerminalTrace();
        /**终端交易时间，yyyyMMddHHmmss，全局统一时间格式**/
        String terminal_time = clyjSaobeiPaymentLogVo.getTerminalTime();
        /**金额，单位分**/
        BigDecimal total_fee = clyjSaobeiPaymentLogVo.getTotalFee();//TODO
        if (StringUtils.isEmpty(pay_type) || StringUtils.isEmpty(service_id) || StringUtils.isEmpty(terminal_trace) || StringUtils.isEmpty(terminal_time)) {
            //日志打印参数
            logger.error("统一下单预支付请求参数:" + "-----"
                    + "pay_type:" + pay_type + "-----" + "service_id:" + service_id + "-----" + "terminal_trace:" + terminal_trace + "-----"
                    + "terminal_time:" + terminal_time + "-----" + "total_fee:" + total_fee);
            return ApiResult.fail(ResultEnum.SAOBEI_PREPAYMENT_REQ_FAIL);
        }
        return ApiResult.success();
    }

    /**
     * 扫呗 统一下单预支付  响应参数校验 验签
     **/
    public ApiResult<?> checkJspayResponseParam(String resultJson) {
        ClyjSaobeiPaymentLogResp r = JSON.parseObject(resultJson, ClyjSaobeiPaymentLogResp.class);
        if (StringUtils.isEmpty(r.getReturn_code()) || !r.getReturn_code().equals(SaoBeiConstants.RETURN_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_COMMUNICATION_FAIL);
        }
        if (StringUtils.isEmpty(r.getResult_code()) || !r.getResult_code().equals(SaoBeiConstants.RESULT_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAOBEI_PREPAYMENT_RESP_FAIL);
        }
        /**公众号id**/
        String appId = r.getAppId();
        /**时间戳**/
        String timeStamp = r.getTimeStamp();
        /**随机字符串**/
        String nonceStr = r.getNonceStr();
        /**订单详情扩展字符串**/
        String package_str = r.getPackage_str();
        /**签名方式**/
        String signType = r.getSignType();
        /**签名**/
        String paySign = r.getPaySign();
        /**金额**/
        BigDecimal total_fee = r.getTotal_fee();//TODO
        /**利楚唯一订单号**/
        String out_trade_no = r.getOut_trade_no();
        String key_sign = r.getKey_sign();
        if (StringUtils.isEmpty(appId) || StringUtils.isEmpty(timeStamp) || StringUtils.isEmpty(nonceStr)
                || StringUtils.isEmpty(package_str) || StringUtils.isEmpty(signType) || StringUtils.isEmpty(paySign)
                || StringUtils.isEmpty(out_trade_no)) {
            /**打印参数**/
            logger.error("统一下单预支付响应参数:" + "-----"
                    + "appId:" + appId + "-----" + "timeStamp:" + timeStamp + "-----" + "nonceStr:" + nonceStr + "-----"
                    + "package_str:" + package_str + "-----" + "signType:" + signType + "-----" + "paySign:" + paySign + "-----"
                    + "total_fee:" + total_fee + "-----" + "out_trade_no:" + out_trade_no);
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_PREPAYMENT_RESP_FAIL);
        }
        /**验签**/
        String sig = "return_code=" + r.getReturn_code() + "&return_msg=" + r.getReturn_msg() + "&result_code=" + r.getResult_code()
                + "&pay_type=" + r.getPay_type() + "&merchant_name=" + r.getMerchant_name() + "&merchant_no=" + r.getMerchant_no()
                + "&terminal_id=" + r.getTerminal_id() + "&terminal_trace=" + r.getTerminal_trace() + "&terminal_time=" + r.getTerminal_time()
                + "&total_fee=" + r.getTotal_fee() + "&out_trade_no=" + r.getOut_trade_no();
        logger.info("统一下单预支付sig:" + sig);
        String signn = MD5.sign(sig, "utf-8");//注：MD5签名方式
        logger.info("统一下单预支付signn:" + signn);
        if (!signn.equals(key_sign)) {
            return ApiResult.fail("统一下单预支付验签失败");
        }
        ClyjSaoBeiWeiXinJsApiRequest clyjSaoBeiWeiXinJsApiRequest = new ClyjSaoBeiWeiXinJsApiRequest();
        clyjSaoBeiWeiXinJsApiRequest.setAppId(appId);
        clyjSaoBeiWeiXinJsApiRequest.setTimeStamp(timeStamp);
        clyjSaoBeiWeiXinJsApiRequest.setNonceStr(nonceStr);
        clyjSaoBeiWeiXinJsApiRequest.setPackage_str(package_str);
        clyjSaoBeiWeiXinJsApiRequest.setSignType(signType);
        clyjSaoBeiWeiXinJsApiRequest.setPaySign(paySign);
        clyjSaoBeiWeiXinJsApiRequest.setTotal_fee(total_fee);
        clyjSaoBeiWeiXinJsApiRequest.setOut_trade_no(out_trade_no);
        return ApiResult.success(clyjSaoBeiWeiXinJsApiRequest);
    }


    /**
     * 扫呗回调接口(交易查询)    参数验证  验签
     **/
    public ApiResult<?> checkJspayNotifyRequestParam(ClyjSaobeiTradeNotify clyjSaobeiTradeNotify) {
        if (clyjSaobeiTradeNotify == null) {
            return ApiResult.fail(ResultEnum.BAD_REQUEST_PARAMETER);
        }
        if (!clyjSaobeiTradeNotify.getReturn_code().equals(SaoBeiConstants.RETURN_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_COMMUNICATION_FAIL);
        }
        if (!clyjSaobeiTradeNotify.getResult_code().equals(SaoBeiConstants.RESULT_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAVE_SAOBEI_NOTIFY_FAIL);
        }
        /**请求类型，010微信，020 支付宝，060qq钱包，080京东钱包，090口碑，100翼支付**/
        String pay_type = clyjSaobeiTradeNotify.getPay_type();
        /**付款方用户id，“微信openid”、“支付宝账户”、“qq号”等**/
        String user_id = clyjSaobeiTradeNotify.getUser_id();
        String merchant_name = clyjSaobeiTradeNotify.getMerchant_name();
        String merchant_no = clyjSaobeiTradeNotify.getMerchant_no();
        String terminal_id = clyjSaobeiTradeNotify.getTerminal_id();
        String terminal_trace = clyjSaobeiTradeNotify.getTerminal_trace();
        String terminal_time = clyjSaobeiTradeNotify.getTerminal_time();
        BigDecimal total_fee = clyjSaobeiTradeNotify.getTotal_fee();
        String end_time = clyjSaobeiTradeNotify.getEnd_time();
        String out_trade_no = clyjSaobeiTradeNotify.getOut_trade_no();
        String channel_trade_no = clyjSaobeiTradeNotify.getChannel_trade_no();
        String attach = clyjSaobeiTradeNotify.getAttach();
        String key_sign = clyjSaobeiTradeNotify.getKey_sign();
        if (StringUtils.isEmpty(pay_type) || StringUtils.isEmpty(user_id) || StringUtils.isEmpty(merchant_name)
                || StringUtils.isEmpty(merchant_no) || StringUtils.isEmpty(terminal_id) || StringUtils.isEmpty(terminal_trace)
                || StringUtils.isEmpty(terminal_time) || StringUtils.isEmpty(end_time) || StringUtils.isEmpty(out_trade_no)
                || StringUtils.isEmpty(channel_trade_no) || StringUtils.isEmpty(attach) || StringUtils.isEmpty(key_sign)
        ) {
            logger.error("统一下单预支付响应参数:" + "-----"
                    + "pay_type:" + pay_type + "-----" + "user_id:" + user_id + "-----" + "merchant_name:" + merchant_name + "-----"
                    + "merchant_no:" + merchant_no + "-----" + "terminal_id:" + terminal_id + "-----" + "terminal_trace:" + terminal_trace + "-----"
                    + "terminal_time:" + terminal_time + "-----" + "end_time:" + end_time + "-----" + "out_trade_no:" + out_trade_no + "-----"
                    + "channel_trade_no:" + channel_trade_no + "-----" + "attach:" + attach + "-----" + "key_sign:" + key_sign);
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_NOTIFY_RESP_FAIL);
        }
        /****
         * 验签
         */
        String parm = "return_code=" + clyjSaobeiTradeNotify.getReturn_code() + "&return_msg=" + clyjSaobeiTradeNotify.getReturn_msg()
                + "&result_code=" + clyjSaobeiTradeNotify.getResult_code() + "&pay_type=" + pay_type + "&user_id=" + user_id
                + "&merchant_name=" + merchant_name + "&merchant_no=" + merchant_no + "&terminal_id=" + terminal_id
                + "&terminal_trace=" + terminal_trace + "&terminal_time=" + terminal_time + "&total_fee=" + total_fee
                + "&end_time=" + end_time + "&out_trade_no" + out_trade_no + "&channel_trade_no=" + channel_trade_no
                + "&attach=" + attach;
        logger.info("扫呗回调接口(交易查询)sig:" + parm);
        String checksign = MD5.sign(parm, "utf-8");//注：MD5签名方式
        logger.info("扫呗回调接口(交易查询)sign:" + checksign);
        if (!key_sign.equals(checksign)) {
            return ApiResult.fail("验签失败");
        }
        return ApiResult.success();
    }


    /**
     * 扫呗 统一下单退款申请    前端请求参数校验
     **/
    public ApiResult<?> checkRefundRequestParam(ClyjSaobeiPaymentRefund clyjSaobeiPaymentRefund) {
        /**请求类型，010微信，020支付宝，060qq钱包，090口碑，100翼支付**/
        String pay_type = clyjSaobeiPaymentRefund.getPayType();
        /**接口类型，当前类型012**/
        String service_id = clyjSaobeiPaymentRefund.getServiceId();
        /**终端退款流水号，填写商户系统的退款流水号**/
        String terminal_trace = clyjSaobeiPaymentRefund.getTerminalTrace();
        /**终端退款时间，yyyyMMddHHmmss，全局统一时间格式**/
        String terminal_time = clyjSaobeiPaymentRefund.getTerminalTime();//TODO
        /**金额，单位分**/
        BigDecimal refund_fee = clyjSaobeiPaymentRefund.getRefund_fee();
        /**订单号，查询凭据，利楚订单号、微信订单号、支付宝订单号任意一个**/
        String out_trade_no = clyjSaobeiPaymentRefund.getOut_trade_no();
        if (StringUtils.isEmpty(pay_type) || StringUtils.isEmpty(service_id) || StringUtils.isEmpty(terminal_trace)
                || StringUtils.isEmpty(out_trade_no) || StringUtils.isEmpty(refund_fee.toString())) {
            //日志打印参数
            logger.error("统一下单退款申请前端请求参数:" + "-----"
                    + "pay_type:" + pay_type + "-----" + "service_id:" + service_id + "-----" + "terminal_trace:" + terminal_trace + "-----"
                    + "terminal_time:" + terminal_time + "-----" + "refund_fee:" + refund_fee + "-----" + "out_trade_no:" + out_trade_no);
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_REFUND_REQ_FAIL);
        }
        return ApiResult.success();
    }

    /**
     * 扫呗 退款申请  响应参数校验 验签
     **/
    public ApiResult<?> checkRefundResponseParam(String resultJson) {
        ClyjSaobeiPaymentRefundResp r = JSON.parseObject(resultJson, ClyjSaobeiPaymentRefundResp.class);
        if (StringUtils.isEmpty(r.getReturn_code()) || !r.getReturn_code().equals(SaoBeiConstants.RETURN_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_COMMUNICATION_FAIL);
        }
        if (StringUtils.isEmpty(r.getResult_code()) || !r.getResult_code().equals(SaoBeiConstants.RESULT_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_REFUND_RESP_FAIL);
        }
        String pay_type = r.getPay_type();
        String merchant_name = r.getMerchant_name();
        String merchant_no = r.getMerchant_no();
        String terminal_id = r.getTerminal_id();
        String terminal_trace = r.getTerminal_trace();
        String terminal_time = r.getTerminal_time();
        BigDecimal refund_fee = r.getRefund_fee();
        String end_time = r.getEnd_time();
        String out_refund_no = r.getOut_refund_no();
        /**利楚唯一订单号**/
        String out_trade_no = r.getOut_trade_no();
        String key_sign = r.getKey_sign();
        if (StringUtils.isEmpty(pay_type) || StringUtils.isEmpty(merchant_name) || StringUtils.isEmpty(merchant_no)
                || StringUtils.isEmpty(terminal_id) || StringUtils.isEmpty(terminal_trace) || StringUtils.isEmpty(refund_fee.toString())
                || StringUtils.isEmpty(out_refund_no) || StringUtils.isEmpty(out_trade_no)) {
            logger.error("退款申请响应参数:" + "-----"
                    + "pay_type:" + pay_type + "-----" + "merchant_name:" + merchant_name + "-----" + "merchant_no:" + merchant_no + "-----"
                    + "terminal_id:" + terminal_id + "-----" + "terminal_trace:" + terminal_trace + "-----" + "refund_fee:" + refund_fee + "-----"
                    + "out_refund_no:" + out_refund_no + "-----" + "out_trade_no:" + out_trade_no + "-----" + "key_sign:" + key_sign + "-----"
                    + "terminal_time:" + terminal_time + "-----" + "end_time:" + end_time);
            return ApiResult.fail(ResultEnum.SAOBEI_REFUND_RESP_FAIL);
        }
        /**验签**/
        String sig = "return_code=" + r.getReturn_code() + "&return_msg=" + r.getReturn_msg() + "&result_code=" + r.getResult_code()
                + "&pay_type=" + r.getPay_type() + "&merchant_name=" + r.getMerchant_name() + "&merchant_no=" + r.getMerchant_no()
                + "&terminal_id=" + r.getTerminal_id() + "&terminal_trace=" + r.getTerminal_trace() + "&terminal_time=" + r.getTerminal_time()
                + "&refund_fee=" + r.getRefund_fee() + "&end_time=" + r.getEnd_time() + "&out_trade_no="
                + r.getOut_trade_no() + "&out_refund_no=" + r.getOut_refund_no();
        logger.info("扫呗 退款申请sig:" + sig);
        String signn = MD5.sign(sig, "utf-8");//注：MD5签名方式
        logger.info("扫呗 退款申请signn:" + signn);
        if (!signn.equals(key_sign)) {
            return ApiResult.fail("退款申请验签失败");
        }
        return ApiResult.success(r);
    }


    /**
     * 扫呗 支付查询    前端请求参数校验
     **/
    public ApiResult<?> checkQueryRequestParam(ClyjSaobeiPaymentQuery clyjSaobeiPaymentQuery) {
        /**请求类型，010微信，020支付宝，060qq钱包，090口碑，100翼支付**/
        String pay_type = clyjSaobeiPaymentQuery.getPayType();
        /**接口类型，当前类型012**/
        String service_id = clyjSaobeiPaymentQuery.getServiceId();
        /**终端查询流水号，填写商户系统的查询流水号**/
        String terminal_trace = clyjSaobeiPaymentQuery.getTerminalTrace();
        /**    终端查询时间，yyyyMMddHHmmss，全局统一时间格式**/
        String terminal_time = clyjSaobeiPaymentQuery.getTerminalTime();//TODO
        /**订单号，查询凭据，利楚订单号、微信订单号、支付宝订单号任意一个**/
        String out_trade_no = clyjSaobeiPaymentQuery.getOut_trade_no();
        if (StringUtils.isEmpty(pay_type) || StringUtils.isEmpty(service_id) || StringUtils.isEmpty(terminal_trace)
                || StringUtils.isEmpty(out_trade_no)) {
            //日志打印参数
            logger.error("扫呗支付前端请求参数:" + "-----"
                    + "pay_type:" + pay_type + "-----" + "service_id:" + service_id + "-----" + "terminal_trace:" + terminal_trace + "-----"
                    + "out_trade_no:" + out_trade_no + "-----" + "terminal_time:" + terminal_time);
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_QUEERY_REQ_FAIL);
        }
        return ApiResult.success();
    }

    /**
     * 扫呗 支付查询  响应参数校验 验签
     **/
    public ApiResult<?> checkQueryResponseParam(String resultJson) {
        ClyjSaobeiPaymentQueryResp r = JSON.parseObject(resultJson, ClyjSaobeiPaymentQueryResp.class);
        if (StringUtils.isEmpty(r.getReturn_code()) || !r.getReturn_code().equals(SaoBeiConstants.RETURN_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_COMMUNICATION_FAIL);
        }
        if (StringUtils.isEmpty(r.getResult_code()) || !r.getResult_code().equals(SaoBeiConstants.RESULT_SUCCESS)) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_QUERY_RESP_FAIL);
        }
        String pay_type = r.getPay_type();
        String merchant_name = r.getMerchant_name();
        String merchant_no = r.getMerchant_no();
        String terminal_id = r.getTerminal_id();
        String terminal_trace = r.getTerminal_trace();
        LocalDateTime terminal_time = r.getTerminal_time();
        BigDecimal total_fee = r.getTotal_fee();
        LocalDateTime end_time = r.getEnd_time();
        /**利楚唯一订单号**/
        String out_trade_no = r.getOut_trade_no();
        String key_sign = r.getKey_sign();
        if (StringUtils.isEmpty(pay_type) || StringUtils.isEmpty(merchant_name) || StringUtils.isEmpty(merchant_no)
                || StringUtils.isEmpty(terminal_id) || StringUtils.isEmpty(terminal_trace) || StringUtils.isEmpty(total_fee.toString())
                || StringUtils.isEmpty(out_trade_no)) {
            /**打印参数**/
            logger.error("扫呗 支付查询  响应参数:" + "-----"
                    + "pay_type:" + pay_type + "-----" + "merchant_name:" + merchant_name + "-----" + "merchant_no:" + merchant_no + "-----"
                    + "terminal_id:" + terminal_id + "-----" + "terminal_trace:" + terminal_trace + "-----" + "total_fee:" + total_fee + "-----"
                    + "out_trade_no:" + out_trade_no + "-----" + "terminal_time:" + terminal_time + "-----" + "end_time:" + end_time);
            return ApiResult.fail(ResultEnum.SAOBEI_REFUND_RESP_FAIL);
        }
        /**验签**/
        String sig = "return_code=" + r.getReturn_code() + "&return_msg=" + r.getReturn_msg() + "&result_code=" + r.getResult_code()
                + "&pay_type=" + r.getPay_type() + "&merchant_name=" + r.getMerchant_name() + "&merchant_no=" + r.getMerchant_no()
                + "&terminal_id=" + r.getTerminal_id() + "&terminal_trace=" + r.getTerminal_trace() + "&terminal_time=" + r.getTerminal_time()
                + "&total_fee=" + r.getTotal_fee() + "&end_time=" + r.getEnd_time() + "&out_trade_no=" + r.getOut_trade_no();
        logger.info("扫呗 支付查询sig:" + sig);
        String signn = MD5.sign(sig, "utf-8");//注：MD5签名方式
        logger.info("扫呗 支付查询signn:" + signn);
        if (!signn.equals(key_sign)) {
            return ApiResult.fail("支付查询验签失败");
        }
        /**交易订单状态，SUCCESS支付成功，REFUND转入退款，NOTPAY未支付，CLOSED已关闭，USERPAYING用户支付中，REVOKED已撤销，NOPAY未支付支付超时，PAYERROR支付失败**/
        String trade_state = r.getTrade_state();
        /**通道订单号，微信订单号、支付宝订单号等，返回时不参与签名**/
        String channel_trade_no = r.getChannel_trade_no();
        /**    银行渠道订单号，微信支付时显示在支付成功页面的条码，可用作扫码查询和扫码退款时匹配**/
        String channel_order_no = r.getChannel_trade_no();
        /**    付款方用户id，“微信openid”、“支付宝账户”、“qq号”等，返回时不参与签名**/
        String user_id = r.getUser_id();
        /**附加数据，原样返回，返回时不参与签名**/
        String attach = r.getAttach();
        /****
         * 响应逻辑TODO
         */
        return ApiResult.success();
    }

}
